Emacs 是一台 Lisp 機器,但偽裝成文字編輯器。
(Emacs 社群諺語)
身為一位 Clojure Programmer,我一直有個遺憾:Clojure 社群最流行的編輯器是 Emacs(約 40% 使用率),但我始終學不會它。
Emacs 的特別之處在於,它的插件語言是 Elisp——一種 Lisp。這對 Lisp 開發者來說就像生產力的外掛,能輕鬆改造編輯器。
問題是:我實在不習慣 Emacs,而 Neovim 雖然支援 Lua 與 VimScript,卻沒有 Lisp。直到我發現 Fennel——一種可以編譯成 Lua 的 Lisp,Neovim 才真正有了 Lisp 選項。
我用 Fennel 開發了幾個插件之後,發現它不只是幫我解決了 Emacs 的問題,更讓我重新思考:在 AI 時代,程式語言與開發範式的選擇,對生產力還有什麼影響?
2025 年,應該很多工程師都用 AI 來輔助軟體開發了,我也不例外。在應用 AI 開發軟體的過程之中,我發現我長年使用的程式語言、編程範式,不僅沒有過時,反而更加顯出它們的價值。它們本來就是改進編程瓶頸的絕佳工具,用了 AI 之後,編程活動既有的瓶頸比起過去還更加顯著。
一般來講,工程師開發軟體,粗略來看,時間用於下列四項活動:
上述四件事的時間分配很可能依人與專案而有不同的統計分布,先假設為 20%: 30%: 30%: 20%
之分布。而應用了 AI 之後,往往是第二項『實際編碼』的時間大幅減少。在有些研究甚至指出,用了 AI 之後,有時候第二項的時間大幅減少,但是第三項的時間反而增加了,因為 AI 寫得快但是品質不穩定。
Clojure 因為是 Lisp 的關系,它支援互動式開發 (interactive development),所以可以做到邊寫邊測。95% 的 programmer 都沒有看過互動式開發,你可以想象成,它是一種不用寫測試的測試驅動開發 (TDD)。換言之,光是互動式開發就可以有效地讓測試的時間縮短。
函數式編程 (Functional Programming) 則可以有效地減少 Bug ,因而進一步減少除錯的時間,而這點已經有一些學術界論文支持。
假設工程師的開發時間分布,分配於「測試除錯」項目的時間約為總開發時間之 30% 。即,在沒有 AI 時,互動式開發與函數式編程能幫你省下最多 30% 的測試與除錯時間;而在 AI 已經大幅減少「實際編碼」時間的情況下,互動式開發與函數式編程的效果會更顯著,省下的時間甚至可能逼近總開發時間之 40%。
真的要講的話,Clojure 真的不容易入門,僅管這件事不少 Clojure Programmers 都死不承認。(編按:你們就乾脆地承認自己 beating the averages 吧!生產力是別人的三到五倍,薪水只多領 20% 不到,這沒有什麼好羞恥的,只不過是 underpaid 而已。)《獨角獸專案》的作者 Gene Kim 也有公開寫文章陳述這件事。
Without doubt, Clojure was one of the most difficult things I’ve learned professionally, ...
Clojure 的難,難在很多方面:
相較之下,對於初學者的話,如果從 Fennel 切入,上述每一項都簡化許多:
來看一段 Fennel 語言的 Hello World!
吧:
(fn greet [name]
(.. "Hello, " name "!"))
(print (greet "world"))
; => Hello, world!
再過幾年,我女兒的學校搞不好也要開始教 programming 了,我都有點想帶著 Fennel 語言去應徵國小電腦課的代課老師了。
如果這篇文章讓你心生嚮往,想一探 Lisp 與函數式編程的魅力,那麼,你不用再觀望了。Fennel 正是那把通往新世界的大門鑰匙,它的低門檻,讓你可以在熟悉的 Neovim 環境中,無痛體驗互動式開發的效率與函數式編程的優雅。
準備好了嗎?讓我們一起開始這趟 Lisp 的輕量級冒險吧!